package com.lzs.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lzs.entity.Dept;
import com.lzs.system.mapper.DeptMapper;
import com.lzs.system.service.DeptService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lzs.util.R;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 部门表 服务实现类
 * </p>
 *
 * @author 刘中帅
 * @since 2020-11-24
 */
@Service
public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements DeptService {
    @Autowired
    private  DeptMapper deptMapper;
    @Override
    public List<Dept> selectDeptTree() {
        // 查询部门信息
        List<Dept> depts = deptMapper.selectList(null);
//        定义一个根节点集合
        List<Dept> root=new ArrayList<>();
//        遍历出最大的部门0 添加到root中
        for (Dept parent:depts){
            if (parent.getPid()==0){
                root.add(parent);
            }
        }
        for (Dept parent:root){
            parent.setChildren(selectChild(parent.getDeptId(),depts));
        }
        return root;
    }

    /**
     *
     * @param page 第几页
     * @param limit 一页几条
     * @param dept 部门实体
     *      部门分页查询
     * @return
     */
    @Override
    public Page<Dept> selectAllDeptPage(Integer page, Integer limit, Dept dept) {
        Page<Dept> deptPage=new Page<>(page,limit);
        String simpleName = dept.getSimpleName();
        QueryWrapper<Dept> queryWrapper=new QueryWrapper<>();
        // 条件查询
        if (StringUtils.isNotEmpty(simpleName)){
            queryWrapper.like("simple_name",simpleName);
        }
        if (dept.getDeptId()!=null){
            // 前台点击部门树时触发查询
            List<Dept> depts = deptMapper.selectList(null);
            List<Dept> child = selectChild(dept.getDeptId(), depts);
            List<Long> list = child.stream().map(item -> item.getDeptId()).collect(Collectors.toList());
            list.add(dept.getDeptId());
            System.out.println(list);
            queryWrapper.in("dept_id",list);
        }
        deptMapper.selectPage(deptPage,queryWrapper);
        return deptPage;
    }

    /**
     *
     * @param dept
     * 部门新增修改方法
     * @return
     */
    @Override
    public R insertOrUpdateDept(Dept dept) {
        // 根据传来的ID是否为空  不为空走修改方法
        if (dept.getDeptId()!=null){
            dept.setUpdateTime(new Date());
            int i = deptMapper.updateById(dept);
            if (i>0){
                return R.ok().message("修改成功");
            }
            return R.error().message("修改失败");
        }else{
            dept.setCreateTime(new Date());
            int i = deptMapper.insert(dept);
            if (i>0){
                return R.ok().message("新增成功");
            }
            return R.error().message("新增失败");
        }
    }

    /**
     *
     * @param deptId
     * 根据当前部门ID查询拥有的仓库
     * @return 返回一个数组。存储当前部门ID拥有的仓库ID
     */
    @Override
    public List<Long> selectWarehouseByDeptId(Long deptId) {
        List<Long> warehouseIds = deptMapper.selectWarehouseByDeptId(deptId);
        return warehouseIds;
    }

    /**
     *
     * @param warehouseIds 前台选中的仓库Id
     * @param deptId 当前部门Id
     *               分配部门仓库
     * @return
     */
    @Override
    public R updateWarehouseByDeptId(Long deptId,List<Long> warehouseIds) {
        if (warehouseIds.size()>0){
            // 判断传来的仓库ID是否为空 不为空 先根据部门ID删除中间表中的数据
            deptMapper.deleteWarehouseByDeptId(deptId);
            // 在增加数据
            int i = deptMapper.insertWarehouseByDeptId(warehouseIds, deptId);
            if (i>0){
                return R.ok().message("配置成功");
            }
            return R.error().message("配置失败");
        }
        // 如果仓库ID为空 证明不给当前部门分配仓库直接把中间表中的数据删除
        deptMapper.deleteWarehouseByDeptId(deptId);
        return R.ok().message("配置成功，当前部门无仓库");
    }

    /**
     *根据ID回显内容
     * @param deptId
     * @return
     */
    @Override
    public R findByDeptId(Long deptId) {
        Dept dept = deptMapper.findByDeptId(deptId);
        return R.ok().data("dept",dept);
    }

    /**
     *
     * @param pid
     * @param depts
     * 递归遍历树结构
     * @return
     */
    public List<Dept> selectChild(Long pid,List<Dept> depts){
//        存放子菜单
        List<Dept> children=new ArrayList<>();
//        遍历出所有一级部门 存放到集合中
        for (Dept father:depts){
            if (father.getPid().equals(pid)){
                children.add(father);
            }
        }
        // 遍历出所有子级菜单  把depts一直遍历直到没有部门Pid 跟上一级Id相同
        for (Dept child:children){
            child.setChildren(selectChild(child.getDeptId(),depts));
        }
        return children;
    }
}
